概率分布是数学中的一个概念, 用来描述不同事件发生的可能性, 通常这些事件限定在一个集合内, 代表了所有可能发生的事件。
在统计学里可以这么理解: 数据是从某种参数未知的概率分布中生成的。由于并不知道具体的参数, 我们只能借用贝叶斯定理从仅有的数据中反推参数。概率分布是构建贝叶斯模型的基础, 不同分布组合在一起之后可以得到一些很有用的复杂模型。
最常见的一种概率分布是高斯分布, 又叫正态分布, 其数学公式描述如下: $$ p d f(x \mid \mu, \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} \mathrm{e}^{\frac{-(x-\mu)^2}{2 \sigma^2}} $$ 上式中, $\mu$ 和 $\sigma$ 是高斯分布的两个参数。第 1 个参数 $\mu$ 是该分布的均值(同时也是中位数和众数), 其取值范围是任意实数, 即 $\mu \in \mathbb{R}$; 第 2 个参数 $\sigma$ 是标准差, 用来衡量分布的离散程度, 其取值只能为正。由于 $\mu$ 和 $\sigma$ 的取值范围无穷大, 因此高斯分布的实例也有无穷多。虽然数学公式这一表达形式简洁明了, 也有人称之有美感, 不过得承认公式还是有些不够直观, 我们可以尝试用 Python 代码 将公式的含义重新表示出来。首先看看高斯分布都长什么样:
import matplotlib.pyplot as plt
import seaborn as sn
import numpy as np
from scipy import stats
mu_params = [-1,0,1]
sd_params =[0.5,1,1.5]
x = np.linspace(-7,7,100)
f,ax = plt.subplots(len(mu_params),len(sd_params),sharex=True,sharey=True,figsize=(20,10))
for i in range(3):
for j in range(3):
mu = mu_params[i]
sd = sd_params[j]
y = stats.norm(mu,sd).pdf(x)
ax[i,j].plot(x,y)
ax[i,j].plot(0,0,label='$\mu$={:3.2f}\n $\sigma$={:3.2f}'.format(mu,sd),alpha=0.5)
ax[i,j].legend(fontsize=12)
ax[2,1].set_xlabel('$x$',fontsize=16)
ax[1,0].set_ylabel('$y$',fontsize=16)
plt.tight_layout()
由概率分布生成的变量 (例如 $x$ ) 称作随机变量, 当然这并不是说该变量可以取任意值,相反,我们观测到该变量的数值受到概率分布的约束, 而其随机性量服从在参数 $\mu$ 和 $\sigma$ 下的高斯分布,我们可以这样表示该变量: $$ x \sim N(\mu, \sigma) $$ 其中, 符号$\sim$读作服从于某种分布。
随机变量分为两种: 连续变量和离散变量。连续随机变量可以从某个区间取任意值 (我们可以用 Python 中的浮点型数据来表示), 而离散随机变量只能取某些特定的值 (我们可以用 Python 中的整型数据来表示)。
许多模型都假设, 如果对服从于同一个分布的多个随机变量进行连续采样, 那么各个变量的采样值之间相互独立, 我们称这些随机变量是独立同分布的。用数学语言描述就是, 如果两个随机变量 $x$ 和 $y$ 对于所有可能的取值都满足 $p(x, y)=p(x) p(y)$, 那么称这两个变量相互独立。
时间序列是不满足独立同分布的一个典型例子。在时间序列中,需要对时间维度的变量多加留心。下面的例子是从 CDIAC (二氧化碳信息分析中心)获取的数据。这份数据记录了从 1959 年到 1997 年大气中二氧化碳的含量。
图中每个点表示每个月空气中二氧化碳舍是的测是值, 可以差到测晤值是与 期性生长和訁败有关);另一个是二氠化碳含是整体性的上升超势。
参考资料:
import matplotlib.pyplot as plt
import seaborn as sn
import numpy as np
from scipy import stats
mu_params = [-1,0,1]
sd_params =[0.5,1,1.5]
x = np.linspace(-7,7,100)
f,ax = plt.subplots(len(mu_params),len(sd_params),sharex=True,sharey=True,figsize=(20,10))
for i in range(3):
for j in range(3):
mu = mu_params[i]
sd = sd_params[j]
y = stats.norm(mu,sd).pdf(x)
ax[i,j].plot(x,y)
ax[i,j].plot(0,0,label='$\mu$={:3.2f}\n $\sigma$={:3.2f}'.format(mu,sd),alpha=0.5)
ax[i,j].legend(fontsize=12)
ax[2,1].set_xlabel('$x$',fontsize=16)
ax[1,0].set_ylabel('$y$',fontsize=16)
plt.tight_layout()
import pandas as pd
data = pd.read_csv('data/load_mauna_loa_CO2.csv',header=None)
data.columns=['year','CO2']
#data['year']=data['year'].astype(int)
data.set_index('year',inplace=True)
data.plot.line()
<AxesSubplot:xlabel='year'>
data.to_excel('data/load_mauna_loa_CO2.xlsx')